The objective of this notebook is to separate the microenvironment (T cells, monocytes, etc.) from the leukemic B (CD79+) cells.
library(Seurat)
library(SeuratWrappers)
library(harmony)
library(tidyverse)
# Paths
path_to_obj <- here::here("results/R_objects/3.seurat_filtered.rds")
path_to_save_microenv <- here::here("results/R_objects/4.seurat_microenvironment.rds")
path_to_save_leukemic <- here::here("results/R_objects/4.seurat_leukemic.rds")
# Colors
color_palette <- c("black", "gray", "red", "yellow", "violet", "green4",
"blue", "mediumorchid2", "coral2", "blueviolet",
"indianred4", "deepskyblue1", "dimgray", "deeppink1",
"green", "lightgray", "hotpink1")
# Source functions
source(here::here("bin/utils.R"))
seurat <- readRDS(path_to_obj)
seurat <- seurat %>%
NormalizeData(
normalization.method = "LogNormalize",
scale.factor = 10000
) %>%
FindVariableFeatures() %>%
ScaleData() %>%
RunPCA() %>%
RunHarmony(group.by.vars = "sample_id", reduction = "pca", dims = 1:30) %>%
RunUMAP(dims = 1:30, reduction = "harmony")
To ease the annotation, let us visualize some key lineage markers
lineage_markers <- c("CD79A", "CD3D", "CD8A", "IL7R", "NKG7",
"LYZ", "HBM", "TOP2A")
lineage_markers_ggs <- purrr::map(lineage_markers, function(x) {
p <- FeaturePlot(seurat, features = x, pt.size = 0.45)
p +
scale_color_viridis_c(option = "magma")
})
names(lineage_markers_ggs) <- lineage_markers
lineage_markers_ggs
## $CD79A
##
## $CD3D
##
## $CD8A
##
## $IL7R
##
## $NKG7
##
## $LYZ
##
## $HBM
##
## $TOP2A
seurat <- FindNeighbors(
seurat,
dims = 1:30,
reduction = "harmony"
)
seurat <- FindClusters(seurat, resolution = 0.1)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
##
## Number of nodes: 40725
## Number of edges: 1073882
##
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.9560
## Number of communities: 6
## Elapsed time: 12 seconds
DimPlot(seurat, cols = color_palette, pt.size = 0.3)
richter_levels <- c("richter_sp", "richter_while-ibrutinib",
"richter_post-ofatu-duvelisib")
seurat$is_richter <- ifelse(
seurat$sample_description %in% richter_levels,
TRUE,
FALSE
)
DimPlot(seurat, group.by = "is_richter")
DimPlot(seurat, group.by = "tissue")
In addition, we have seen a cluster of erythroblasts (HBM+) that cluster with the CD79A+ cells, most likely due to its strong proliferative signature. We will fetch them with the FindSubCluster function and rule them out from the analysis:
# Subcluster
seurat <- FindSubCluster(
seurat,
cluster = "3",
graph.name = "RNA_snn",
subcluster.name = "fetch_erythroblasts",
resolution = 0.2
)
## Modularity Optimizer version 1.3.0 by Ludo Waltman and Nees Jan van Eck
##
## Number of nodes: 951
## Number of edges: 30548
##
## Running Louvain algorithm...
## Maximum modularity in 10 random starts: 0.8995
## Number of communities: 5
## Elapsed time: 0 seconds
DimPlot(seurat, group.by = "fetch_erythroblasts", cols = color_palette)
Idents(seurat) <- "fetch_erythroblasts"
# Find markers of potential erythroblasts
markers_erythroblasts <- purrr::map(c("3_3", "3_4"), function(x) {
df <- FindMarkers(
seurat,
ident.1 = x,
only.pos = TRUE,
logfc.threshold = 0.75
)
df <- df %>%
rownames_to_column("gene") %>%
arrange(desc(avg_log2FC))
df
})
names(markers_erythroblasts) <- c("3_3", "3_4")
DT::datatable(markers_erythroblasts$`3_3`)
DT::datatable(markers_erythroblasts$`3_4`)
# Subset
mask <- colnames(seurat)[!(seurat$fetch_erythroblasts %in% c("3_3", "3_4"))]
seurat <- subset(seurat, cells = mask)
DimPlot(seurat, cols = color_palette)
As we can see, clusters 2 and 4 correspond to T cells, NK cells and monocytes.
microenv_clusters <- c("2", "4")
leuk_clusters <- c("0", "1", "3_0", "3_1", "3_2")
microenv <- subset(seurat, idents = microenv_clusters)
leuk <- subset(seurat, idents = leuk_clusters)
DimPlot(leuk, cols = color_palette, pt.size = 0.3)
DimPlot(microenv, cols = color_palette, pt.size = 0.3)
saveRDS(microenv, path_to_save_microenv)
saveRDS(leuk, path_to_save_leukemic)
sessionInfo()
## R version 4.0.4 (2021-02-15)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 20.04.2 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.9.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.9.0
##
## locale:
## [1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C LC_TIME=es_ES.UTF-8 LC_COLLATE=en_US.UTF-8 LC_MONETARY=es_ES.UTF-8 LC_MESSAGES=en_US.UTF-8 LC_PAPER=es_ES.UTF-8 LC_NAME=C LC_ADDRESS=C LC_TELEPHONE=C LC_MEASUREMENT=es_ES.UTF-8 LC_IDENTIFICATION=C
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] forcats_0.5.1 stringr_1.4.0 dplyr_1.0.6 purrr_0.3.4 readr_1.4.0 tidyr_1.1.3 tibble_3.1.2 ggplot2_3.3.3 tidyverse_1.3.1 harmony_1.0 Rcpp_1.0.6 SeuratWrappers_0.3.0 SeuratObject_4.0.2 Seurat_4.0.3 BiocStyle_2.18.1
##
## loaded via a namespace (and not attached):
## [1] readxl_1.3.1 backports_1.2.1 plyr_1.8.6 igraph_1.2.6 lazyeval_0.2.2 splines_4.0.4 crosstalk_1.1.1 listenv_0.8.0 scattermore_0.7 digest_0.6.27 htmltools_0.5.1.1 fansi_0.5.0 magrittr_2.0.1 tensor_1.5 cluster_2.1.1 ROCR_1.0-11 limma_3.46.0 remotes_2.4.0 globals_0.14.0 modelr_0.1.8 matrixStats_0.59.0 spatstat.sparse_2.0-0 colorspace_2.0-1 rvest_1.0.0 ggrepel_0.9.1 haven_2.4.1 xfun_0.23 crayon_1.4.1 jsonlite_1.7.2 spatstat.data_2.1-0 survival_3.2-10 zoo_1.8-9 glue_1.4.2 polyclip_1.10-0 gtable_0.3.0 leiden_0.3.8 future.apply_1.7.0 abind_1.4-5 scales_1.1.1 DBI_1.1.1 miniUI_0.1.1.1 viridisLite_0.4.0 xtable_1.8-4 reticulate_1.20 spatstat.core_2.1-2 rsvd_1.0.5 DT_0.18 htmlwidgets_1.5.3 httr_1.4.2 RColorBrewer_1.1-2 ellipsis_0.3.2 ica_1.0-2 farver_2.1.0 pkgconfig_2.0.3
## [55] sass_0.4.0 uwot_0.1.10 dbplyr_2.1.1 deldir_0.2-10 here_1.0.1 utf8_1.2.1 labeling_0.4.2 tidyselect_1.1.1 rlang_0.4.11 reshape2_1.4.4 later_1.2.0 munsell_0.5.0 cellranger_1.1.0 tools_4.0.4 cli_2.5.0 generics_0.1.0 broom_0.7.7 ggridges_0.5.3 evaluate_0.14 fastmap_1.1.0 yaml_2.2.1 goftest_1.2-2 knitr_1.33 fs_1.5.0 fitdistrplus_1.1-5 RANN_2.6.1 pbapply_1.4-3 future_1.21.0 nlme_3.1-152 mime_0.10 xml2_1.3.2 compiler_4.0.4 rstudioapi_0.13 plotly_4.9.4 png_0.1-7 spatstat.utils_2.2-0 reprex_2.0.0 bslib_0.2.5.1 stringi_1.6.2 highr_0.9 RSpectra_0.16-0 lattice_0.20-41 Matrix_1.3-4 vctrs_0.3.8 pillar_1.6.1 lifecycle_1.0.0 BiocManager_1.30.15 spatstat.geom_2.1-0 lmtest_0.9-38 jquerylib_0.1.4 RcppAnnoy_0.0.18 data.table_1.14.0 cowplot_1.1.1 irlba_2.3.3
## [109] httpuv_1.6.1 patchwork_1.1.1 R6_2.5.0 bookdown_0.22 promises_1.2.0.1 KernSmooth_2.23-18 gridExtra_2.3 parallelly_1.26.0 codetools_0.2-18 MASS_7.3-53.1 assertthat_0.2.1 rprojroot_2.0.2 withr_2.4.2 sctransform_0.3.2 mgcv_1.8-36 parallel_4.0.4 hms_1.1.0 grid_4.0.4 rpart_4.1-15 rmarkdown_2.8 Rtsne_0.15 shiny_1.6.0 lubridate_1.7.10